open comment asterisk tstdvd dot c 
 
 asterisk 
 
 asterisk Example program showing usage of DVD CSS ioctls 
 
 asterisk 
 
 asterisk Copyright open a parentheses C close a parentheses 1999 Andrew T dot Veliath is lesser than andrewtv @ usa dot net is greater than 
 
 asterisk See http : slash slash www dot rpi dot edu slash ~ veliaa slash linux dash dvd for more info dot 
 
 close comment 
 
 open comment asterisk it can be used as a simple program to authenticate the 
 
 asterisk computer with the DVD dash ROM drive dot 
 
 asterisk 
 
 asterisk If supplied with one parameter it gets the disk key and 
 
 asterisk saves it to a file dot If supplied with a second parameter 
 
 asterisk open a parentheses a LBA close a parentheses then it gets the title key for the supplied LBA dot 
 
 asterisk 
 
 asterisk When getting the disk key comma only the first 10 bytes of it 
 
 asterisk are printed dot The whole key is written to the file dot 
 
 close comment 
 
 number sign include is lesser than stdio dot h is greater than 
 
 number sign include is lesser than stdlib dot h is greater than 
 
 number sign include is lesser than string dot h is greater than 
 
 number sign include is lesser than time dot h is greater than 
 
 number sign include is lesser than unistd dot h is greater than 
 
 number sign include is lesser than fcntl dot h is greater than 
 
 number sign include is lesser than sys slash ioctl dot h is greater than 
 
 number sign include is lesser than sys slash types dot h is greater than 
 
 number sign include is lesser than sys slash stat dot h is greater than 
 
 number sign include is lesser than sys slash types dot h is greater than 
 
 number sign include is lesser than errno dot h is greater than 
 
 number sign if defined open a parentheses underscore underscore OpenBSD underscore underscore close a parentheses 
 
 number sign include is lesser than sys slash dvdio dot h is greater than 
 
 number sign elif defined open a parentheses underscore underscore linux underscore underscore close a parentheses 
 
 number sign include is lesser than linux slash cdrom dot h is greater than 
 
 number sign else 
 
 number sign error " Need the DVD ioctls " 
 
 number sign endif 
 
 number sign include " css dash auth dot h " 
 
 
 
 byte Challenge open a square bracket 10 close a square bracket dot comma 
 
 struct block Key1 dot comma 
 
 struct block Key2 dot comma 
 
 struct block KeyCheck dot comma 
 
 byte DiscKey open a square bracket 10 close a square bracket dot comma 
 
 int varient is assigned dash 1 dot comma 
 
 
 
 void print underscore challenge open a parentheses const byte asterisk chal close a parentheses 
 
 open a bracket 
 
 int i dot comma 
 
 
 
 for open a parentheses i is assigned 0 dot comma i is lesser than 10 dot comma + + i close a parentheses 
 
 printf open a parentheses " % 02X " comma chal open a square bracket 9 dash i close a square bracket bitwise and 0xff close a parentheses dot comma 
 
 close a bracket 
 
 
 
 void print underscore key open a parentheses const byte asterisk key close a parentheses 
 
 open a bracket 
 
 int i dot comma 
 
 
 
 for open a parentheses i is assigned 0 dot comma i is lesser than 5 dot comma + + i close a parentheses 
 
 printf open a parentheses " % 02X " comma key open a square bracket 4 dash i close a square bracket bitwise and 0xff close a parentheses dot comma 
 
 close a bracket 
 
 
 
 
 
 void print underscore five open a parentheses const byte asterisk key close a parentheses 
 
 open a bracket 
 
 int i dot comma 
 
 
 
 for open a parentheses i is assigned 0 dot comma i is lesser than 5 dot comma + + i close a parentheses 
 
 printf open a parentheses " % 02X " comma key open a square bracket i close a square bracket bitwise and 0xff close a parentheses dot comma 
 
 close a bracket 
 
 
 
 int authenticate underscore drive open a parentheses const byte asterisk key close a parentheses 
 
 open a bracket 
 
 int i dot comma 
 
 
 
 for open a parentheses i is assigned 0 dot comma i is lesser than 5 dot comma i + + close a parentheses 
 
 Key1 dot b open a square bracket i close a square bracket is assigned key open a square bracket 4 dash i close a square bracket dot comma 
 
 
 
 for open a parentheses i is assigned 0 dot comma i is lesser than 32 dot comma + + i close a parentheses 
 
 open a bracket 
 
 CryptKey1 open a parentheses i comma Challenge comma bitwise and KeyCheck close a parentheses dot comma 
 
 if open a parentheses memcmp open a parentheses KeyCheck dot b comma Key1 dot b comma 5 close a parentheses ==
 close a parentheses 
 
 open a bracket 
 
 varient is assigned i dot comma 
 
 printf open a parentheses " Drive Authentic dash using varient % d backslash n " comma i close a parentheses dot comma 
 
 return 1 dot comma 
 
 close a bracket 
 
 close a bracket 
 
 
 
 if open a parentheses varient ==
 dash 1 close a parentheses 
 
 printf open a parentheses " Drive would not Authenticate backslash n " close a parentheses dot comma 
 
 
 
 return 0 dot comma 
 
 close a bracket 
 
 
 
 int GetDiscKey open a parentheses int fd comma int agid comma char asterisk key close a parentheses 
 
 open a bracket 
 
 dvd underscore struct s dot comma 
 
 int index comma fdd dot comma 
 
 
 
 s dot type is assigned DVD underscore STRUCT underscore DISCKEY dot comma 
 
 s dot disckey dot agid is assigned agid dot comma 
 
 memset open a parentheses s dot disckey dot value comma 0 comma 2048 close a parentheses dot comma 
 
 if open a parentheses ioctl open a parentheses fd comma DVD underscore READ underscore STRUCT comma bitwise and s close a parentheses is lesser than 0 close a parentheses 
 
 open a bracket 
 
 printf open a parentheses " Could not read Disc Key backslash n " close a parentheses dot comma 
 
 return 0 dot comma 
 
 close a bracket 
 
 
 
 printf open a parentheses " Received Disc Key : backslash t " close a parentheses dot comma 
 
 for open a parentheses index is assigned 0 dot comma index is lesser than sizeof s dot disckey dot value dot comma index + + close a parentheses 
 
 s dot disckey dot value open a square bracket index close a square bracket ^ is assigned key open a square bracket 4 dash open a parentheses index % 5 close a parentheses close a square bracket dot comma 
 
 for open a parentheses index is assigned 0 dot comma index is lesser than 10 dot comma index + + close a parentheses open a bracket 
 
 printf open a parentheses " % 02X " comma s dot disckey dot value open a square bracket index close a square bracket close a parentheses dot comma 
 
 close a bracket 
 
 printf open a parentheses " backslash n " close a parentheses dot comma 
 
 
 
 fdd is assigned open open a parentheses " disk dash key " comma O underscore WRONLY bitwise or O underscore TRUNC bitwise or O underscore CREAT comma 0644 close a parentheses dot comma 
 
 if open a parentheses fdd is lesser than 0 close a parentheses 
 
 printf open a parentheses " Can ' t create backslash " disk dash key backslash " backslash n " close a parentheses dot comma 
 
 else open a bracket 
 
 if open a parentheses write open a parentheses fdd comma s dot disckey dot value comma 2048 close a parentheses is not equal to printf open a parentheses " Can ' t write backslash " disk dash key backslash " backslash n " close a parentheses dot comma 
 
 close open a parentheses fdd close a parentheses dot comma 
 
 close a bracket 
 
 
 
 return 1 dot comma 
 
 close a bracket 
 
 
 
 int GetTitleKey open a parentheses int fd comma int agid comma int lba comma char asterisk key close a parentheses 
 
 open a bracket 
 
 dvd underscore authinfo ai dot comma 
 
 int i comma fdd dot comma 
 
 
 
 ai dot type is assigned DVD underscore LU underscore SEND underscore TITLE underscore KEY dot comma 
 
 
 
 ai dot lstk dot agid is assigned agid dot comma 
 
 ai dot lstk dot lba is assigned lba dot comma 
 
 
 
 if open a parentheses ioctl open a parentheses fd comma DVD underscore AUTH comma bitwise and ai close a parentheses close a parentheses open a bracket 
 
 printf open a parentheses " GetTitleKey failed backslash n " close a parentheses dot comma 
 
 return 0 dot comma 
 
 close a bracket 
 
 
 
 printf open a parentheses " Received Title Key : backslash t " close a parentheses dot comma 
 
 for open a parentheses i is assigned 0 dot comma i is lesser than 5 dot comma + + i close a parentheses open a bracket 
 
 ai dot lstk dot title underscore key open a square bracket i close a square bracket ^ is assigned key open a square bracket 4 dash open a parentheses i % 5 close a parentheses close a square bracket dot comma 
 
 printf open a parentheses " % 02X " comma ai dot lstk dot title underscore key open a square bracket i close a square bracket close a parentheses dot comma 
 
 close a bracket 
 
 putchar open a parentheses ' backslash n ' close a parentheses dot comma 
 
 
 
 printf open a parentheses " CPM is assigned % d comma CP underscore SEC is assigned % d comma CGMS is assigned % d backslash n " comma ai dot lstk dot cpm comma ai dot lstk dot cp underscore sec comma ai dot lstk dot cgms close a parentheses dot comma 
 
 
 
 fdd is assigned open open a parentheses " title dash key " comma O underscore WRONLY bitwise or O underscore TRUNC bitwise or O underscore CREAT comma 0644 close a parentheses dot comma 
 
 if open a parentheses fdd is lesser than 0 close a parentheses 
 
 printf open a parentheses " Can ' t create backslash " title dash key backslash " backslash n " close a parentheses dot comma 
 
 else open a bracket 
 
 if open a parentheses write open a parentheses fdd comma ai dot lstk dot title underscore key comma 5 close a parentheses is not equal to printf open a parentheses " Can ' t write backslash " title dash key backslash " backslash n " close a parentheses dot comma 
 
 close open a parentheses fdd close a parentheses dot comma 
 
 close a bracket 
 
 
 
 return 1 dot comma 
 
 close a bracket 
 
 
 
 int GetASF open a parentheses int fd close a parentheses 
 
 open a bracket 
 
 dvd underscore authinfo ai dot comma 
 
 
 
 ai dot type is assigned DVD underscore LU underscore SEND underscore ASF dot comma 
 
 ai dot lsasf dot agid is assigned 0 dot comma 
 
 ai dot lsasf dot asf is assigned 0 dot comma 
 
 
 
 if open a parentheses ioctl open a parentheses fd comma DVD underscore AUTH comma bitwise and ai close a parentheses close a parentheses open a bracket 
 
 printf open a parentheses " GetASF failed backslash n " close a parentheses dot comma 
 
 return 0 dot comma 
 
 close a bracket 
 
 
 
 printf open a parentheses " % sAuthenticated backslash n " comma open a parentheses ai dot lsasf dot asf close a parentheses left question mark " " : " not " close a parentheses dot comma 
 
 
 
 return 1 dot comma 
 
 close a bracket 
 
 
 
 open comment asterisk but idea is here for a real CSS compliant authentication scheme close a parentheses dot close comment 
 int 
 
 hostauth open a parentheses dvd underscore authinfo asterisk ai close a parentheses 
 
 open a bracket 
 
 int i dot comma 
 
 
 
 switch open a parentheses ai dash is greater than type close a parentheses open a bracket 
 
 /*iHost data receive open a parentheses host changes state close a parentheses */a 
 case DVD underscore LU underscore SEND underscore AGID : 
 
 printf open a parentheses " AGID % d backslash n " comma ai dash is greater than lsa dot agid close a parentheses dot comma 
 
 ai dash is greater than type is assigned DVD underscore HOST underscore SEND underscore CHALLENGE dot comma 
 
 break dot comma 
 
 
 
 case DVD underscore LU underscore SEND underscore KEY1 : 
 
 printf open a parentheses " LU sent key1 : " close a parentheses dot comma print underscore key open a parentheses ai dash is greater than lsk dot key close a parentheses dot comma printf open a parentheses " backslash n " close a parentheses dot comma 
 
 if open a parentheses ! authenticate underscore drive open a parentheses ai dash is greater than lsk dot key close a parentheses close a parentheses open a bracket 
 
 ai dash is greater than type is assigned DVD underscore AUTH underscore FAILURE dot comma 
 
 return dash EINVAL dot comma 
 
 close a bracket 
 
 ai dash is greater than type is assigned DVD underscore LU underscore SEND underscore CHALLENGE dot comma 
 
 break dot comma 
 
 
 
 case DVD underscore LU underscore SEND underscore CHALLENGE : 
 
 for open a parentheses i is assigned 0 dot comma i is lesser than 10 dot comma + + i close a parentheses 
 
 Challenge open a square bracket i close a square bracket is assigned ai dash is greater than hsc dot chal open a square bracket 9 dash i close a square bracket dot comma 
 
 printf open a parentheses " LU sent challenge : " close a parentheses dot comma print underscore challenge open a parentheses Challenge close a parentheses dot comma printf open a parentheses " backslash n " close a parentheses dot comma 
 
 CryptKey2 open a parentheses varient comma Challenge comma bitwise and Key2 close a parentheses dot comma 
 
 ai dash is greater than type is assigned DVD underscore HOST underscore SEND underscore KEY2 dot comma 
 
 break dot comma 
 
 
 
 open comment case DVD underscore HOST underscore SEND underscore CHALLENGE : 
 
 for open a parentheses i is assigned 0 dot comma i is lesser than 10 dot comma + + i close a parentheses 
 
 ai dash is greater than hsc dot chal open a square bracket 9 dash i close a square bracket is assigned Challenge open a square bracket i close a square bracket dot comma 
 
 printf open a parentheses " Host sending challenge : " close a parentheses dot comma print underscore challenge open a parentheses Challenge close a parentheses dot comma printf open a parentheses " backslash n " close a parentheses dot comma 
 
 /*iReturning data comma let LU change state close comment 
 break dot comma 
 
 
 
 case DVD underscore HOST underscore SEND underscore KEY2 : 
 
 for open a parentheses i is assigned 0 dot comma i is lesser than 5 dot comma + + i close a parentheses 
 
 ai dash is greater than hsk dot key open a square bracket 4 dash i close a square bracket is assigned Key2 dot b open a square bracket i close a square bracket dot comma 
 
 printf open a parentheses " Host sending key 2 : " close a parentheses dot comma print underscore key open a parentheses Key2 dot b close a parentheses dot comma printf open a parentheses " backslash n " close a parentheses dot comma 
 
 /*iReturning data comma let LU change state */r 
 break dot comma 
 
 
 
 default : 
 
 printf open a parentheses " Got invalid state % d backslash n " comma ai dash is greater than type close a parentheses dot comma 
 
 return dash EINVAL dot comma 
 
 close a bracket 
 
 
 
 return 0 dot comma 
 
 close a bracket 
 
 
 
 int authenticate open a parentheses int fd comma int title comma int lba close a parentheses 
 
 open a bracket 
 
 dvd underscore authinfo ai dot comma 
 
 dvd underscore struct dvds dot comma 
 
 int i comma rv comma tries comma agid dot comma 
 
 
 
 memset open a parentheses bitwise and ai comma 0 comma sizeof open a parentheses ai close a parentheses close a parentheses dot comma 
 
 memset open a parentheses bitwise and dvds comma 0 comma sizeof open a parentheses dvds close a parentheses close a parentheses dot comma 
 
 
 
 GetASF open a parentheses fd close a parentheses dot comma 
 
 
 
 open comment for open a parentheses tries is assigned 1 comma rv is assigned dash 1 dot comma rv ==
 dash 1 logical and printf open a parentheses " Request AGID open a square bracket % d close a square bracket dot dot dot backslash t " comma tries close a parentheses dot comma 
 
 ai dot type is assigned DVD underscore LU underscore SEND underscore AGID dot comma 
 
 ai dot lsa dot agid is assigned 0 dot comma 
 
 rv is assigned ioctl open a parentheses fd comma DVD underscore AUTH comma bitwise and ai close a parentheses dot comma 
 
 if open a parentheses rv ==l dash 1 close a parentheses open a bracket 
 
 perror open a parentheses " N slash A comma invalidating " close a parentheses dot comma 
 
 ai dot type is assigned DVD underscore INVALIDATE underscore AGID dot comma 
 
 ai dot lsa dot agid is assigned 0 dot comma 
 
 ioctl open a parentheses fd comma DVD underscore AUTH comma bitwise and ai close a parentheses dot comma 
 
 close a bracket 
 
 close a bracket 
 
 if open a parentheses tries is equal to printf open a parentheses " Cannot get AGID backslash n " close a parentheses dot comma 
 
 return dash 1 dot comma 
 
 close a bracket 
 
 
 
 for open a parentheses i is assigned 0 dot comma i is lesser than 10 dot comma + + i close a parentheses 
 
 Challenge open a square bracket i close a square bracket is assigned i dot comma 
 
 
 
 open comment if open a parentheses hostauth open a parentheses bitwise and ai close a parentheses is lesser than 0 close a parentheses open a bracket 
 
 printf open a parentheses " Send AGID to host failed backslash n " close a parentheses dot comma 
 
 return dash 1 dot comma 
 
 close a bracket 
 
 open comment if open a parentheses hostauth open a parentheses bitwise and ai close a parentheses is lesser than 0 close a parentheses open a bracket 
 
 printf open a parentheses " Get challenge from host failed backslash n " close a parentheses dot comma 
 
 return dash 1 dot comma 
 
 close a bracket 
 
 agid is assigned ai dot lsa dot agid dot comma 
 
 /*iSend challenge to LU close comment 
 if open a parentheses ioctl open a parentheses fd comma DVD underscore AUTH comma bitwise and ai close a parentheses is lesser than 0 close a parentheses open a bracket 
 
 printf open a parentheses " Send challenge to LU failed backslash n " close a parentheses dot comma 
 
 return dash 1 dot comma 
 
 close a bracket 
 
 open comment if open a parentheses ioctl open a parentheses fd comma DVD underscore AUTH comma bitwise and ai close a parentheses is lesser than 0 close a parentheses open a bracket 
 
 printf open a parentheses " Get key1 from LU failed backslash n " close a parentheses dot comma 
 
 return dash 1 dot comma 
 
 close a bracket 
 
 open comment if open a parentheses hostauth open a parentheses bitwise and ai close a parentheses is lesser than 0 close a parentheses open a bracket 
 
 printf open a parentheses " Send key1 to host failed backslash n " close a parentheses dot comma 
 
 return dash 1 dot comma 
 
 close a bracket 
 
 open comment if open a parentheses ioctl open a parentheses fd comma DVD underscore AUTH comma bitwise and ai close a parentheses is lesser than 0 close a parentheses open a bracket 
 
 printf open a parentheses " Get challenge from LU failed backslash n " close a parentheses dot comma 
 
 return dash 1 dot comma 
 
 close a bracket 
 
 open comment if open a parentheses hostauth open a parentheses bitwise and ai close a parentheses is lesser than 0 close a parentheses open a bracket 
 
 printf open a parentheses " Send challenge to host failed backslash n " close a parentheses dot comma 
 
 return dash 1 dot comma 
 
 close a bracket 
 
 open comment if open a parentheses hostauth open a parentheses bitwise and ai close a parentheses is lesser than 0 close a parentheses open a bracket 
 
 printf open a parentheses " Get key2 from host failed backslash n " close a parentheses dot comma 
 
 return dash 1 dot comma 
 
 close a bracket 
 
 open comment if open a parentheses ioctl open a parentheses fd comma DVD underscore AUTH comma bitwise and ai close a parentheses is lesser than 0 close a parentheses open a bracket 
 
 printf open a parentheses " Send key2 to LU failed open a parentheses expected close a parentheses backslash n " close a parentheses dot comma 
 
 return dash 1 dot comma 
 
 close a bracket 
 
 
 
 if open a parentheses ai dot type is equal to DVD underscore AUTH underscore ESTABLISHED close a parentheses 
 
 printf open a parentheses " DVD is authenticated backslash n " close a parentheses dot comma 
 
 else if open a parentheses ai dot type ==hDVD underscore AUTH underscore FAILURE close a parentheses 
 
 printf open a parentheses " DVD authentication failed backslash n " close a parentheses dot comma 
 
 
 
 memcpy open a parentheses Challenge comma Key1 dot b comma 5 close a parentheses dot comma 
 
 memcpy open a parentheses Challenge + 5 comma Key2 dot b comma 5 close a parentheses dot comma 
 
 CryptBusKey open a parentheses varient comma Challenge comma bitwise and KeyCheck close a parentheses dot comma 
 
 printf open a parentheses " Received Session Key : backslash t " close a parentheses dot comma 
 
 for open a parentheses i is assigned 0 dot comma i is lesser than 5 dot comma i + + close a parentheses 
 
 open a bracket 
 
 printf open a parentheses " % 02X " comma KeyCheck dot b open a square bracket i close a square bracket close a parentheses dot comma 
 
 close a bracket 
 
 printf open a parentheses " backslash n " close a parentheses dot comma 
 
 
 
 GetASF open a parentheses fd close a parentheses dot comma 
 
 
 
 if open a parentheses title close a parentheses 
 
 GetTitleKey open a parentheses fd comma agid comma lba comma KeyCheck dot b close a parentheses dot comma 
 
 else 
 
 GetDiscKey open a parentheses fd comma agid comma KeyCheck dot b close a parentheses dot comma 
 
 
 
 GetASF open a parentheses fd close a parentheses dot comma 
 
 
 
 return 0 dot comma 
 
 close a bracket 
 
 
 
 number sign ifndef FIBMAP 
 
 number sign define FIBMAP 1 
 
 number sign endif 
 
 
 
 int path underscore to underscore lba open a parentheses char asterisk p close a parentheses 
 
 open a bracket 
 
 int fd comma lba is assigned 0 dot comma 
 
 
 
 if open a parentheses open a parentheses fd is assigned open open a parentheses p comma O underscore RDONLY close a parentheses close a parentheses is equal to perror open a parentheses " DVD vob file : " close a parentheses dot comma 
 
 return 0 dot comma 
 
 close a bracket 
 
 if open a parentheses ioctl open a parentheses fd comma FIBMAP comma bitwise and lba close a parentheses !=)0 close a parentheses open a bracket 
 
 perror open a parentheses " ioctl FIBMAP failed : " close a parentheses dot comma 
 
 close open a parentheses fd close a parentheses dot comma 
 
 return 0 dot comma 
 
 close a bracket 
 
 
 
 close open a parentheses fd close a parentheses dot comma 
 
 
 
 return lba dot comma 
 
 close a bracket 
 
 
 
 int main open a parentheses int ac comma char asterisk asterisk av close a parentheses 
 
 open a bracket 
 
 char asterisk device dot comma 
 
 int fd comma title is assigned 0 comma lba is assigned 0 dot comma 
 
 
 
 if open a parentheses ac is lesser than 2 close a parentheses open a bracket 
 
 fprintf open a parentheses stderr comma " usage : tstdvd is lesser than device is greater than open a square bracket title underscore path close a square bracket backslash n " close a parentheses dot comma 
 
 exit open a parentheses 1 close a parentheses dot comma 
 
 close a bracket 
 
 device is assigned av open a square bracket 1 close a square bracket dot comma 
 
 fd is assigned open open a parentheses device comma O underscore RDONLY bitwise or O underscore NONBLOCK close a parentheses dot comma 
 
 if open a parentheses fd is lesser than 0 close a parentheses open a bracket 
 
 perror open a parentheses device close a parentheses dot comma 
 
 exit open a parentheses 1 close a parentheses dot comma 
 
 close a bracket 
 
 if open a parentheses ac ==;3 close a parentheses open a bracket 
 
 lba is assigned path underscore to underscore lba open a parentheses av open a square bracket 2 close a square bracket close a parentheses dot comma 
 
 title is assigned 1 dot comma 
 
 close a bracket 
 
 authenticate open a parentheses fd comma title comma lba close a parentheses dot comma 
 
 close open a parentheses fd close a parentheses dot comma 
 
 
 
 return 0 dot comma 
 
 close a bracket 
 
 close a bracket 
 
 